AWS IoT 再入門ブログリレー Amazon Lex編
1 はじめに
CX事業本部平内(SIN)です。
本企画は、弊社チームIoTメンバーが初心に返ってIoTサービスについて学びなおし、解説してみようというものです。
本エントリーでは、音声やテキストを使用して、任意のアプリケーションに対話型インターフェイスを構築できる「Amazon Lex」について紹介します。
Amazon Lexの主な特徴は、以下のとおりです。
- コンソールから、テキスト又は、音声のチャットボットを構築、テスト、公開できる
- 既存のアプリケーションに会話型インターフェイスを追加できる
- Amazon Alexa と同じ会話型エンジンが開発者から利用可能
- 高度な機能性と柔軟性の自然言語理解 (NLU) と自動音声認識 (ASR) が提供されている
- ボットを作成するにあたり深層学習に関する専門知識は不要であり、コンソールから基本的な会話フローを指定するだけ
- AWS Lambda との統合済みで、他の多くのAWSサービスとの連携も可能
- 初期費用や最低料金はなく、実際に行ったテキストや音声のリクエストに対してのみ料金
なお、先月(2021/04)、遂に日本語にも対応し、今後、利用範囲が広がるかもしれません。
Amazon Lex が日本語に対応。東京リージョンでお使いいただけます
[Amazon Lex] 遂に来た! Amazon Lexが、日本語化されたので、早速、日本語ボットを作ってみました
2 ユースケース
AWSのドキュメントで紹介されているユースケースとしては、以下のようなものが挙げられています。
(1) コールセンターのチャットボットと音声アシスタント
コールセンターでチャットボットや音声アシスタントとして使用することで、エージェント対応無しで、顧客の目的の全て、若しくは、一部を達成できます。Amazon Connectでも、Amazon Lexとの統合が可能です。
(2) 質問応答ボットと情報ボット
最新のニュースの更新情報、試合の得点、天気予報など、定型的なリクエストに答えるボットを作成できます。
(3) アプリケーションボット
アプリケーションに強力なUIの追加が可能です。また、Amazon Cognito と統合されているため、ユーザー管理、認証、同期を制御できます。
(4) エンタープライズ生産性ボット
エンタープライズなチャットボットを作成することで、一般的な業務の合理化、効率向上ができます。
3 仕組み
Amazon Lexの仕組みは以下の様になっています。
- アプリケーションからは、音声若しくは、テキストで入力が入ります。
- 音声で入った入力は、自動音声認識(ASR)によってテキスト化されます。
- テキスト入力は、自然言語理解(NLU)によって、その内容を理解します。
- 予め設定された、インテント(意図)とのマッチングを行います。
- インテントが決定されれば、あらかじめ定義された設定に基づき、スロット(変数)の回収に進みます。
- スロットの回収のためには、クライアントへ質問と言う形でレスポンスを返し、スロット値を聞き出します。
- この際、音声形式でレスポンスを返す場合は、Amazon Pollyによって音声変換されます。
- バリデーション用のLambdaが設定されている場合は、逐次、入力及び、レスポンスを開発者が制御できます。
- インテント及び、スロットの回収が完了した時点で、フルフィルメントとなります。
- フルフィルメントにLambdaが設定されている場合は、この時点で、ビジネスロジックを実装可能です。
- 接続されたLambdaは、その他のAWSサービスや、外部API等と連携することも可能です。
NLU、ASR、Pollyなどの高度なディープラーニングテクノロジーは、会話から学んで賢くなって行くと言う事で、クライアントからは、まるで人間と会話を交わしている様な体験を提供することが可能です。
4 用語
Amazon Lexで使用されている用語についてです。
(1) ボット
Amazon Lexにおいて作成するのは、ボットです。複数のボットを作成できますが、それぞれは独立しており、個々のボットが1つの「アプリ」といったイメージです。
(2) インテント
直訳すると「意図」ですが、Amazon Lexにおいて、一つのジョブのような扱いになるかも知れません。
ボットには、複数のインテントを定義できます。 サンプルにある「お花を注文する」ボットには、「花を注文する」という1つのインテントのみが定義されています。
もし、旅行の予約をするボットを作成するとしたら、「ホテルの予約」「航空機の手配」「オプションツアー」といった複数のインテントを定義する事になるかも知れません。
インテントは、自由に作成できますが、「キャンセル」「ストップ」「ヘルプ」「初めから」のような組み込みのインテントも利用可能です。
https://docs.aws.amazon.com/ja_jp/lex/latest/dg/howitworks-builtins-intents.html
※ Amazon Lexでは、AMAZON.YesIntent、及び、 AMAZON.NoIntentは、利用できません。
(3) スロット
スロットは、パラメータ・変数のようなもので、1つのインテントに、0個以上のスロットを定義することができます。
サンプルにある「お花を注文する」インテントでは、「花の種類」「受け取る日」「受け取る時間」の3つのストットが定義されています。
(4) スロットタイプ
スロットには、型情報があります。 サンプルにある「お花を注文する」インテントにおけるスロットは、それぞれ以下のスロットタイプになっています。
- 花の種類 FlowerTypes
- 受け取る日 AMAZON.DATE
- 受け取る時間 AMAZON.TIME
上記のうち、AMAZON.DATE(日付)及び、AMAZON.TIME(時間)は、予め、定義されている、組み込みスロットです。
そして、FlowerTypesは、「ユリ」「チューリップ」「バラ」の3種類のうちの1つをとるスロットタイプで、独自に定義したものです。
(5) コンテキスト
Amazon Lexでは、コンテキストという概念があります。ボットに複数のインテントが定義されている場合、どの様な状況で、どのインテントにヒットするのかなどを、コンテキストで制御できます。
コンテキストの管理については、昨年(2020/11)利用可能となていますが、残念ながら、現在、日本語では利用できません。
Amazon Lex でのコンテキスト管理の発表
(6) フルフィルメント
フルフィルメントとは、インテントを処理している際に、当該インテントに定義されたスロットが、全て入力された状態をさします。 通常は、このタイミングで、インテントの目的となるビジネスロジックを実行する事になります。
5 Lambda 関数の使用
Amazon Lexでは、ボットのコードフックとして、AWS Lambda 関数を作成できます。
Amazon Lex 開発者ガイド / Lambda 関数の使用
Lambdaの定義は、以下の2箇所で可能です。
- Lambda initialization and validation
- Fulfillment
(1) Lambda initialization and validation
Initialization and validation code hookにチェックを入れる事で、全てのターンで設定したLambdaが呼びだされます。
全てのターンとは、ユーザーの入力を受け取るたびにという意味です。このため、全てのユーザーの入力に対して、バリデーションや、より良いUXの提供が可能になります。
例えば、以下のようなやりとりが、ユーザーとボットの間であったとします。時間というスロットを埋めるため、ボットがそれを聞き出すための質問を投げ、ユーザーが、それに答えた事でスロットが埋まっている様子です。
ボット:何時に受け取りますか? ユーザー:午後9時 ボット:21時で承りました。
上記では、21時という時間をそのまま受け取ってしまっていますが、例えは、お店が、午後7時で閉店だった場合、これでは、問題となります。
そこで、バリデーション用のLambdaを定義し、現在の時間から判断して、「午後9時」が、閉店後に該当するので、スロット値を無効化し、「本日の営業は、午後7時までです。何時に受け取りますか」というようなレスポンスを返すことが可能になります。
ボットの定義は、コンソール上だけでも可能ですが、この例のように、ある程度ロジックが必要なボットを作成する場合、このバリデーション用のLambda実装は、必須だと思います。
(2) Fulfillment
Fulfillmentの設定で、AWS Lambda functionを選択すると、フルフィルメントのタイミングで設定したLambdaが呼ばれます。
フルフィルメントは、当該インテントの目的達成のタイミングであるため、このLambdaで、別のインテントへの遷移や、実際のビジネスロジックを定義することになると思います。
実際のビジネスロジックは、お花屋さんの注文で有れば、実際の「発注処理」(メール送信とか、APIコールとか)になるのではないでしょうか。
6 デプロイ
Amazon Lexで作成されたボットを利用するためにいくつかのデプロイ方法が提供されています。
(1) チャンネル
作成したボットは、Facebook、Slack、及び Twilio などのメッセージングプラットフォームに簡単にデプロイすることが可能になっています。
Deploying an Amazon Lex Bot on a Messaging Platform
(2) API
チャンネル設定にない、独自のプラットフォームでも、提供されるAPIを使用することで実装が可能です。
下記は、Githubで公開されている、Webブラウザでの実装例です。
aws-samples/aws-lex-web-ui
(3) Amazon Connect
Amazon Connectでは、Amazon Lexをボットとして組み込むことが可能です。
通常、「**は1番を、XXXは2番を、押してください」のようなIVR(Interactive Voice Response)で処理されるフローを、ボットに置き換えることで、UXの向上が見込めます。
Amazon Connect 管理者ガイド / Amazon Lex ボットを追加する
(4) AWS Amplify
AWS Amplify では、質問に答えるだけでのボット作成や、コンポーネントとしてボットのUIが提供されています。
AWS Amplify が、Amazon Lex による AI 対応チャットボットのサポートを開始
下記のようなUIであれば、1行でアプリケーションに組み込む事が可能です。
Amplify UI Components
7 最後に
今回は、初心に返ってIoTサービスについて学びなおし、解説してみようということで、Amazon Lex について紹介しました。
最初にも触れましたが、日本語対応となった事で、利用される場面は、これからどんどん増えてくるよに思います。また、Amazon Connectと連携する事で、コンタクトセンターのUXを大幅に向上させる原動力になるのでは?と個人的には感じています。
申し訳ありません、説明不十分なところは、併記させて頂いたURL等をご参照頂ければ幸いです。
8 参考リンク
Amazon Lex チャットボット向けの会話型 AI
Amazon Lex 開発者ガイド
以下は、過去に、Amazon Lexに関して投稿させて頂いた記事です。興味湧くものがありましたら、辿っていただければ嬉しいです。
[Amazon Lex] Amazon Lexが日本語対応となったので、Amazon Connectから使用して居酒屋の電話予約をボット化してみました
[Amazon Lex] 遂に来た! Amazon Lexが、日本語化されたので、早速、日本語ボットを作ってみました
[Amazon Lex] MQTTで通信するLexクライアントを作ってみました。
[Amazon Lex] Lex-SDKでセッション情報や永続化情報が簡単に扱えるようになりました
[Amazon Lex] サンプル発話にヒットしなくてもインテントに入れる方法(実験結果)
[Amazon Lex] インテントに入らなかった時のエラー処理 (Error Handling) について
[Amazon Lex] PostContent及び、PostTextにおける、現在の会話の状態について確認してみました。
[Amazon Lex] HTML+JavaScriptで作成したLexクライアントでカード情報の表示に対応してみました。
[Amazon Lex] PostContent及び、PostTextにおける、現在の会話の状態について確認してみました。
[Amazon Lex] HTML+JavaScriptで作成したLexクライアントでカード情報の表示に対応してみました。
[Amazon Lex] バリデーションのLambdaから動的に生成したレスポンスカードを返してみる
[Amazon Lex] Amazon Connectからダイヤルトーン と音声の両方でシームレスにインテントを起動する
[Amazon Lex] HTML+JavaScriptでLexクライアントを作ってみました(音声対応)
[Amazon Lex] HTML+JavaScriptでLexクライアントを作ってみました
[Amazon Lex] Alexa SDK V2 みたいに書けるSDKを雑に作ってみました
[Lex] Amazon Connectを使用して Amazon Lex を電話で使用してみる
[Alexa] Amazon LexのスキーマからAlexaスキルを作成する
[iOS][Amazon Lex] 音声でもタップでも操作できるBotアプリ(クライアント編)
Amazon Lex の Prompt response cards を試してみました
遂にGAとなった Amazon Lex をiOS SDKから使用してみました。
[Amazon Lex] AWS Amplify + Vue.js でWebページにボットを追加してみました